package model

import (
	"database/sql/driver"
	"encoding/json"
)

// // 实际上我们需要分为多个仓库来进行发货！！！选择最近的
//type Stock struct {
//	BaseModel
//	Name string				// 仓库名
//	Address string 			// 仓库地址
//
//}

type Inventory struct {
	BaseModel
	Goods   int32 `gorm:"type:int;index"`
	Stocks  int32 `gorm:"type:int;"`  // 实际可用库存
	Freeze  int32 `gorm:"type:int;"`  // 冻结库存（预扣减的库存）
	Version int32 `gorm:"type:int;"` // 实现分布式锁的乐观锁！！！
}

type Delivery struct {
	Goods   int32  `gorm:"type:int;index"`
	Nums    int32  `gorm:"type:int"`
	OrderSn string `gorm:"type:varchar(200)"`
	Status  string `gorm:"type:varchar(200)"` //1. 表示等待支付，预扣减，需要保证幂等性 2. 表示支付成功，扣减库存 3. 失败(需要回滚)，回复库存
}

type GoodsDetail struct {
	Goods int32
	Num   int32
}
type GoodsDetailList []GoodsDetail

func (g GoodsDetailList) Value() (driver.Value, error) {
	return json.Marshal(g)
}

// Scan 实现 sql.Scanner 接口，Scan 将 value 扫描至 Jsonb
func (g *GoodsDetailList) Scan(value interface{}) error {
	return json.Unmarshal(value.([]byte), &g)
}

type StockSellDetail struct {
	OrderSn string          `gorm:"type:varchar(200);index:idx_order_sn,unique;"`
	Status  int32           `gorm:"type:varchar(200)"` //1 表示已扣减 2. 表示已归还
	Detail  GoodsDetailList `gorm:"type:varchar(200)"`
}

// TCC事务状态表
type TccTransaction struct {
	BaseModel
	OrderSn     string          `gorm:"type:varchar(200);index:idx_order_sn,unique;"` // 订单号
	Status      int32           `gorm:"type:int;default:0"`                           // 0:Try阶段 1:Confirm阶段 2:Cancel阶段
	Detail      GoodsDetailList `gorm:"type:varchar(200)"`                            // 商品详情
	TryTime     int64           `gorm:"type:bigint"`                                  // Try阶段时间戳
	ConfirmTime int64           `gorm:"type:bigint"`                                  // Confirm阶段时间戳
	CancelTime  int64           `gorm:"type:bigint"`                                  // Cancel阶段时间戳
}

// 预扣减库存表
type PreDeductInventory struct {
	BaseModel
	OrderSn string `gorm:"type:varchar(200);index:idx_order_sn,unique;"` // 订单号
	Goods   int32  `gorm:"type:int;index"`                               // 商品ID
	Num     int32  `gorm:"type:int"`                                     // 预扣减数量
	Status  int32  `gorm:"type:int;default:0"`                           // 0:预扣减 1:确认扣减 2:取消扣减
}

// Redis库存缓存结构
type RedisInventory struct {
	GoodsId    int32 `json:"goods_id"`
	Stocks     int32 `json:"stocks"`      // 实际库存
	Freeze     int32 `json:"freeze"`      // 冻结库存
	Version    int32 `json:"version"`     // 版本号
	UpdateTime int64 `json:"update_time"` // 更新时间
}

// 库存同步任务
type InventorySyncTask struct {
	GoodsId    int32  `json:"goods_id"`
	Action     string `json:"action"`     // "update", "freeze", "unfreeze"
	Amount     int32  `json:"amount"`
	OrderSn    string `json:"order_sn"`
	Timestamp  int64  `json:"timestamp"`
}

// 库存操作日志
type InventoryLog struct {
	BaseModel
	GoodsId    int32  `gorm:"type:int;index"`
	Action     string `gorm:"type:varchar(50)"` // "扣减", "冻结", "解冻", "同步"
	Amount     int32  `gorm:"type:int"`
	OrderSn    string `gorm:"type:varchar(200)"`
	BeforeStocks int32 `gorm:"type:int"`
	AfterStocks  int32 `gorm:"type:int"`
	BeforeFreeze int32 `gorm:"type:int"`
	AfterFreeze  int32 `gorm:"type:int"`
	Source      string `gorm:"type:varchar(20)"` // "redis", "mysql"
	Status      int32  `gorm:"type:int;default:1"` // 1:成功 0:失败
}
